<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vSOcd09Z-rLHeBz966OLQnKkEeiB-k_AqR78_ru0la2k0Gb-Mwlxn5BZYj9zBl8ANxfEhEog0PeH6U0/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - September 24th 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - September 24th 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_nqa5g1hl5tsg-5>li:before{content:"\0025a0  "}.lst-kix_nqa5g1hl5tsg-6>li:before{content:"\0025cf  "}.lst-kix_nqa5g1hl5tsg-4>li:before{content:"\0025cb  "}.lst-kix_nqa5g1hl5tsg-8>li:before{content:"\0025a0  "}.lst-kix_nqa5g1hl5tsg-1>li:before{content:"\0025cb  "}.lst-kix_nqa5g1hl5tsg-2>li:before{content:"\0025a0  "}.lst-kix_nqa5g1hl5tsg-3>li:before{content:"\0025cf  "}ul.lst-kix_d6vkte37s55u-6{list-style-type:none}ul.lst-kix_d6vkte37s55u-5{list-style-type:none}ul.lst-kix_d6vkte37s55u-4{list-style-type:none}ul.lst-kix_d6vkte37s55u-3{list-style-type:none}.lst-kix_nqa5g1hl5tsg-7>li:before{content:"\0025cb  "}ul.lst-kix_d6vkte37s55u-8{list-style-type:none}ul.lst-kix_d6vkte37s55u-7{list-style-type:none}ul.lst-kix_oefin2pw4ot9-1{list-style-type:none}ul.lst-kix_oefin2pw4ot9-2{list-style-type:none}ul.lst-kix_oefin2pw4ot9-3{list-style-type:none}ul.lst-kix_oefin2pw4ot9-4{list-style-type:none}.lst-kix_d6vkte37s55u-0>li:before{content:"\0025cf  "}ul.lst-kix_oefin2pw4ot9-0{list-style-type:none}ul.lst-kix_oefin2pw4ot9-5{list-style-type:none}ul.lst-kix_oefin2pw4ot9-6{list-style-type:none}ul.lst-kix_oefin2pw4ot9-7{list-style-type:none}ul.lst-kix_oefin2pw4ot9-8{list-style-type:none}.lst-kix_oefin2pw4ot9-1>li:before{content:"\0025cb  "}.lst-kix_oefin2pw4ot9-2>li:before{content:"\0025a0  "}.lst-kix_d6vkte37s55u-8>li:before{content:"\0025a0  "}.lst-kix_oefin2pw4ot9-0>li:before{content:"\0025cf  "}.lst-kix_oefin2pw4ot9-4>li:before{content:"\0025cb  "}.lst-kix_d6vkte37s55u-7>li:before{content:"\0025cb  "}.lst-kix_oefin2pw4ot9-3>li:before{content:"\0025cf  "}.lst-kix_d6vkte37s55u-1>li:before{content:"\0025cb  "}.lst-kix_d6vkte37s55u-2>li:before{content:"\0025a0  "}.lst-kix_d6vkte37s55u-3>li:before{content:"\0025cf  "}.lst-kix_d6vkte37s55u-4>li:before{content:"\0025cb  "}.lst-kix_d6vkte37s55u-6>li:before{content:"\0025cf  "}.lst-kix_d6vkte37s55u-5>li:before{content:"\0025a0  "}ul.lst-kix_nqa5g1hl5tsg-0{list-style-type:none}ul.lst-kix_d6vkte37s55u-2{list-style-type:none}ul.lst-kix_d6vkte37s55u-1{list-style-type:none}ul.lst-kix_d6vkte37s55u-0{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-6{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-5{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-8{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-7{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-2{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-1{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}ul.lst-kix_nqa5g1hl5tsg-4{list-style-type:none}ul.lst-kix_nqa5g1hl5tsg-3{list-style-type:none}.lst-kix_nqa5g1hl5tsg-0>li:before{content:"\0025cf  "}.lst-kix_oefin2pw4ot9-8>li:before{content:"\0025a0  "}.lst-kix_oefin2pw4ot9-5>li:before{content:"\0025a0  "}.lst-kix_oefin2pw4ot9-6>li:before{content:"\0025cf  "}.lst-kix_oefin2pw4ot9-7>li:before{content:"\0025cb  "}ol{margin:0;padding:0}table td,table th{padding:0}.c9{-webkit-text-decoration-skip:none;color:#000000;font-weight:400;text-decoration:line-through;vertical-align:baseline;text-decoration-skip-ink:none;font-size:11pt;font-family:"Arial";font-style:normal}.c4{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c7{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c3{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c12{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c8{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c0{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c10{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c14{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c1{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c11{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c6{padding:0;margin:0}.c2{color:inherit;text-decoration:inherit}.c5{font-weight:700}.c13{background-color:#ffffff}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c11"><h2 class="c0" id="h.m1y4bhhexb3v"><span class="c8">Participants</span></h2><p class="c14"><span class="c3">Nic Jansma, Yoav Weiss, Peter Perlepes, Neil Craig, Noam Helfman, Gilles Dubuc, Marcel Duran, Steven Bougon, Nicolás Peña Moreno, Timo Tijhof, Michal Mocny, Thomas Kelly, Sean Feng, Carine Bournez, Alex Christensen, Annie Sullivan, Benjamin de Kosnik,</span></p><h2 class="c0" id="h.6e4jj945ur5p"><span class="c8"><b>Next Call</b>: October 8th @ 10am PST / 1pm EST</span></h2><h2 class="c0" id="h.480s0c42can1"><span class="c8">TPAC</span></h2><ul class="c6 lst-kix_d6vkte37s55u-0 start"><li class="c4 li-bullet-0"><span class="c3">Is coming!</span></li><li class="c4 li-bullet-0"><span class="c3">Agenda coming soon</span></li><li class="c4 li-bullet-0"><span class="c3">Please send your presentation ideas to Nic or Yoav</span></li></ul><h2 class="c0" id="h.ly5tm4y0o0x"><span class="c8">Minutes</span></h2><h3 class="c10" id="h.2g3yr2hirozd"><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/navigation-timing/issues/128&amp;sa=D&amp;source=editors&amp;ust=1613233949911000&amp;usg=AOvVaw1eklKilgT-mB5fo6JRvPjx">worker start needs to be added to diagram</a></span></h3><ul class="c6 lst-kix_nqa5g1hl5tsg-0 start"><li class="c4 li-bullet-0"><span><b>related</b>: </span><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/navigation-timing/issues/100&amp;sa=D&amp;source=editors&amp;ust=1613233949911000&amp;usg=AOvVaw1U-VMllvFne4srTbznffvW">workerStart should be clearly defined as applicable to the last SW · Issue #100 · w3c/navigation-timing</a></span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: a result of the hackathon that turned out bigger than expected</span></li><li class="c4 li-bullet-0"><span>… PR - </span><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/navigation-timing/pull/131&amp;sa=D&amp;source=editors&amp;ust=1613233949911000&amp;usg=AOvVaw0pLRHF1rnMfOPLMB1yIzhu"><b>WIP</b>: workerStart and redirects · Issue #131 · w3c/navigation-timing</a></span><span class="c3">&nbsp;</span></li><li class="c4 li-bullet-0"><span class="c3">… Got a request to add workerStart to the navigation timing diagram</span></li><li class="c4 li-bullet-0"><span class="c3">… Service worker start up time happens before the fetch of the last resource</span></li><li class="c4 li-bullet-0"><span class="c3">… Found a free things that wanted to make sure everyone agrees with</span></li><li class="c4 li-bullet-0"><span class="c3">… SW start up time happens right before the fetch</span></li><li class="c4 li-bullet-0"><span class="c3">… Need to make that more obvious in the diagram, maybe add another phase</span></li><li class="c4 li-bullet-0"><span class="c5">Noam</span><span class="c3"><b></b>: that implicates that workerStart starts before the fetch?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: yeah, and the time between them represents the time the worker took to start up</span></li><li class="c4 li-bullet-0"><span class="c3">… that one is low controversy</span></li><li class="c4 li-bullet-0"><span class="c3">… There’s a bug in the processing model where in case of redirects workerStart is reflecting the time of the cross-origin worker if one existed. This PR fixes that</span></li><li class="c4 li-bullet-0"><span class="c3">… Also workerStart itself is not same-origin protected, because it’s part of the final origin you land on</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: One tricky case: If we’re going from A =&gt; B =&gt; C=&gt; B, where B has a SW, would we expose B’s SW start time, and hence details on C?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: For multiple redirects, the SW start up time will always be the first request of the last same-origin redirect chain. In your example it’d probably be a 0ms startup time.</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: I agree that it should be 0.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: The redirect start and end time exposes something similar, right?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: The redirects are protected by the same origin check. Any redirects off origin zeroize them</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: So redirects on the chain on the same-origin won’t be visible if cross-origin redirect exist?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: Correct</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: but not for SW?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: that’s the proposal here. </span></li><li class="c4 li-bullet-0"><span class="c3">...If we set redirect start for the same origin chain, you could infer the time the cross-origin redirects took. fetchStart enables some inference but with less confidence, because you’re not aware of the redirects.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: Should we have a second box in the diagram? That would be helpful. At Wikimedia we added an extra box called “gaps”.</span></li><li class="c4 li-bullet-0"><span class="c5">Marcel</span><span class="c3"><b></b>: question on the box between “redirect” and “AppCache”. workerStart could mean different things. Does the state of the SW matter in the redirect chains?</span></li><li class="c4 li-bullet-0"><span class="c3">...In theory the fetchStart could be calculated by getting the timestamp from the fetch event, no?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: For Navigation Timing we don’t have access to the fetch() API for those requests.</span></li><li class="c4 li-bullet-0"><span class="c5">Marcel</span><span class="c3"><b></b>: If the fetch start should be the navigation timing, the SW is triggering a fetch event which would be the time here, at least inside the SW context</span></li><li class="c4 li-bullet-0"><span class="c3">… workerStart always had a huge gap between “worker already running” and “worker is starting” times and they mean different things.</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: There’s a “worker start time” and “worker about to fetch” time and if the difference between them is very large the worker is being spun up, but we’re not explicitly exposing that.</span></li><li class="c4 li-bullet-0"><span class="c3">… Are you arguing for more clarity?</span></li><li class="c4 li-bullet-0"><span class="c5">Marcel</span><span class="c3"><b></b>: If we introduce another box in between, what’s the point of it? It’s a single metric without an end</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: I imagined fetchStart to be the end of that box</span></li><li class="c4 li-bullet-0"><span class="c5">Marcel</span><span class="c3"><b></b>: OK, related to the redirect chain, if all the SW’s involved don’t fetch anything, should we only count the last one?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: In the same origin case, workerStart would be the beginning of the first request to the same origin and fetchStart would be the beginning of the last request.</span></li><li class="c4 li-bullet-0"><span class="c3">… In that case you’d also have redirect start and end and your workerstart time would also include redirects.</span></li><li class="c4 li-bullet-0"><span class="c3">… So one downside here is that we won’t be able to separate SW start time from redirects.</span></li><li class="c4 li-bullet-0"><span class="c3">… So if your redirect takes a second, that would be included in the time</span></li><li class="c4 li-bullet-0"><span class="c5">Marcel</span><span class="c3"><b></b>: What would be the box, just workerStart?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: workerStart at the beginning.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: If we don’t expose redirects, but do expose workerStart that may be confusing. I don’t know if we regret not exposing same-origin redirects, but we should make it consistent. Not expose one without the other.</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: So for consistency, it should be the worker starting time of only the last request? So if you have a series of redirects, you won’t be able to measure the SW startup time. But in the other way, you wouldn’t either because the redirect would be included in the reported time.</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: But in that scenario the SW will delay the request. Unless we’re talking about navigation preload, but otherwise the SW is in the critical path</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: It’s in the critical path, but we can’t measure what it is if there are redirects. Even if it’s just same-origin redirects, workerStart will be at the beginning of that phase.</span></li><li class="c4 li-bullet-0"><span class="c3">… We don’t really have workerEnd here</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: Isn’t fetch start like workerEnd for this?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: For the second request, but for the first one workerStart will be missing as it’s in between the redirects. Unless we have an actual workerEnd.</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: During the hackathon we talked about maybe splitting the redirect phase into cross-origin and a full chain of same-origin phases. But that won’t help in case there’s a same-origin request as part of the cross-origin redirect chain.</span></li><li class="c4 li-bullet-0"><span class="c3">… But maybe that’s fine. Not sure how popular are those flows compared to same origin redirects.</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: Seems like a common pattern for user-click reporting.</span></li><li class="c4 li-bullet-0"><span class="c5">...</span><span class="c3">&nbsp;Now that we talked about it, it’d be sad if workerStart would be useless in the case of redirects</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: Why is there no workerEnd?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: Not sure. The work was done 4-5 years ago</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: If there aren’t security implications it could represent the first fetch in the last same-origin chain.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: Question in chat to talk more about gaps mentioned earlier - there are all these start and end ranges, but the steps don’t add up to the total, there’s typically a 10ms gap. So we attribute some steps to those gaps between the boxes.</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: mPulse deals with this as well. We commonly call them different names: HOL blocking, etc</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span><b></b>: AI to everyone to find current users and try to make them part of this conversation</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: Also need to make sure we’re not breaking existing users too much and all UAs are ok with that</span></li><li class="c4 li-bullet-0"><span class="c5">Benjamin</span><span class="c3"><b></b>: maybe inching towards “worker startup time” instead of workerStart</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: That’s also something we’re trying to expose in mPulse as well, as we’ve seen it impacting our customers</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span><b></b>: There’s a </span><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/119&amp;sa=D&amp;source=editors&amp;ust=1613233949917000&amp;usg=AOvVaw08SUYjEfny78ZydEbh_TYM">RT issue #119</a></span><span class="c3">&nbsp;about workers as well</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: I’ll keep it in mind</span></li></ul><h3 class="c10" id="h.m51mbz3rvsq7"><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/performance-timeline/issues/176&amp;sa=D&amp;source=editors&amp;ust=1613233949917000&amp;usg=AOvVaw2wz-s8P738mBxk-9HTNigM">Hard to feature-detect observe() parameters</a></span><span class="c12">&nbsp; </span></h3><ul class="c6 lst-kix_oefin2pw4ot9-0 start"><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: We've added some parameters to .observe() of PO, using "buffered" flag or "type"</span></li><li class="c4 li-bullet-0"><span class="c3">... It's not easy to feature detect whether the buffered flag is supported in a UA</span></li><li class="c4 li-bullet-0"><span class="c3">... You could do a try/catch</span></li><li class="c4 li-bullet-0"><span class="c3">... Bad ergonomics, and requires exception handling to detect</span></li><li class="c4 li-bullet-0"><span class="c3">... Some developers not comfortable doing this in production code</span></li><li class="c4 li-bullet-0"><span class="c3">… If anyone used it, any feedback?</span></li><li class="c4 li-bullet-0"><span class="c5">Nic</span><span class="c3"><b></b>: A current UA would throw a UnsupportedArgument (or whatever) exception?</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: Yes, I would expect it would throw, but haven’t verified</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: If we were to add some feature detection, we'd do some sort of "supported" pattern for the supported parameters</span></li><li class="c4 li-bullet-0"><span class="c3"><b>Nicolás</b>: Yeah. Right now parameters that don’t mean anything are ignored. It’s throwing because it doesn’t have entryTypes.</span></li><li class="c4 li-bullet-0"><span class="c5">Peter</span><span class="c3"><b></b>: The try/catch way is also one of the ways proposed for feature detection, but there's existing discussion for passive event listeners</span></li></ul><ul class="c6 lst-kix_oefin2pw4ot9-1 start"><li class="c7 li-bullet-0"><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md%23feature-detection&amp;sa=D&amp;source=editors&amp;ust=1613233949918000&amp;usg=AOvVaw1z4u0K91GfwRHvWxqZnLdj">https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection</a></span></li><li class="c7 li-bullet-0"><span class="c1 c13"><a class="c2" href="https://www.google.com/url?q=https://github.com/heycam/webidl/issues/107&amp;sa=D&amp;source=editors&amp;ust=1613233949919000&amp;usg=AOvVaw3tOOxOzIwj8RBH7880jvtk">Need pattern for feature detecting dictionary members · Issue #107 · heycam/webidl</a></span></li></ul><ul class="c6 lst-kix_oefin2pw4ot9-0"><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span><b></b>: That seems super relevant. Seems like someone needs to read through the issue.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: Anecdotally, we had a try/catch on the buffered version and didn't have it on the non-buffered version, nested try/catch made the ergonomics bad</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: Unfortunately even if newer browsers add the new supported way of detecting support, the older browser would still need multiple levels of detection since they wouldn't support that way of detecting</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: Also, by the time browser support for that would happen, we would probably drop support for the oldest browsers that require this nesting.</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: Will take a look at the open issue and comment on our needs</span></li></ul><h3 class="c10" id="h.cg4hbomhxf08"><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3c/performance-timeline/issues/168&amp;sa=D&amp;source=editors&amp;ust=1613233949920000&amp;usg=AOvVaw0BPsaqbQyzA4kEsMsyg-po">performance-timeline #168 - Reset the observers </a></span></h3><ul class="c6 lst-kix_oefin2pw4ot9-0"><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: We don't have a good way to measure SPAs other than UserTiming, so asking for a way to reset the observers</span></li><li class="c4 li-bullet-0"><span class="c5">Michal</span><span class="c3"><b></b>: Layout Instability already works well for SPAs</span></li><li class="c4 li-bullet-0"><span class="c3">... For things like InputDelay there's room to make it work</span></li><li class="c4 li-bullet-0"><span class="c3">... For FP, FCP, after page load (blank canvas) is much different than from an arbitrary point, but also the metrics that come back won't be equivalent</span></li><li class="c4 li-bullet-0"><span class="c3">… There are security and performance reasons as to why this is hard, but also, the metrics won’t be equivalent.</span></li><li class="c4 li-bullet-0"><span class="c3">... For LCP should it be just the portion of the DOM that changed, or related to the whole page?</span></li><li class="c4 li-bullet-0"><span class="c3">… So, IMO, it doesn’t make sense to just reset metrics</span></li><li class="c4 li-bullet-0"><span class="c3">... FirstInputDelay and EventTiming, there's a minimum threshold for input events, whereas for SPA events if you reset you may want a 0 threshold to make sure it gets reported</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: Right. Because FID is always reported but only slow events are. There’s also a security question of whether we can enable that.</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: We may want to fold this into a broader SPA reporting issue</span></li><li class="c4 li-bullet-0"><span class="c3">... Maybe we can have a joint label to track them all</span></li><li class="c4 li-bullet-0"><span>... AI to add label</span></li></ul><h3 class="c10" id="h.rme8evrm5enr"><span class="c12">hasDroppedEntry</span></h3><ul class="c6 lst-kix_oefin2pw4ot9-0"><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span><b></b>: Was doing a </span><span class="c1"><a class="c2" href="https://www.google.com/url?q=https://github.com/w3ctag/design-reviews/issues/547&amp;sa=D&amp;source=editors&amp;ust=1613233949921000&amp;usg=AOvVaw1HhZyOc6y0MLnsFkxayNb-">TAG review for hasDroppedEntry</a></span></li><li class="c4 li-bullet-0"><span class="c3">... Parameter for callback of PO</span></li><li class="c4 li-bullet-0"><span class="c3">... Tells you whether the observer has been observing an entrytype where at least one entry was dropped from the buffer. &nbsp;Indicates that you lost some data on the observer</span></li><li class="c4 li-bullet-0"><span class="c3">... TAG didn't like the name "hasDroppedEntry", proposed "hasBufferOverflow"</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: Only concern is it's not the bestest English, hasBufferOverflown?</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: Unrelated to naming - would there be compat issues for a callback that now has an extra parameter?</span></li><li class="c4 li-bullet-0"><span class="c5">Yoav</span><span class="c3"><b></b>: It’s theoretically observable through the args, but it will only break if someone explicitly checked that this argument is undefined before. So, I wouldn't expect breakage</span></li><li class="c4 li-bullet-0"><span class="c5">Noam</span><span class="c3"><b></b>: Back to naming: concern around association with security term "buffer overflow"</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span class="c3"><b></b>: "isFull"</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span class="c3"><b></b>: But we mean that it was full and then at least another entry was added.</span></li><li class="c4 li-bullet-0"><span class="c5">Timo</span><span><b></b>: "wasFullAndThenSome" :)</span></li><li class="c4 li-bullet-0"><span class="c5">Nicolás</span><span><b></b>: Will follow up with TAG for naming</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjoxGnv6ML-rsZJ4ETe_yXx-Zwre5TPafZFY3wbUm7WEF2J97_xf4HDlDXQ9UUo7Pl3OCFwIwqDq7c-_k7ws:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>